package com.zzyq.pc.common.plugin.shiro;

import java.util.Collection;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
import org.apache.shiro.session.mgt.eis.SessionDAO;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.support.DefaultSubjectContext;
import org.apache.shiro.util.CollectionUtils;

import com.zzyq.pc.utils.SpringContextUtil;
import com.zzyq.pc.web.user.model.User;

/**
 * 
 * <p>
 * 
 * @Title: TokenManager.java
 * @Description: Shiro的Token管理工具类
 * @author: Sywd丶吴迪
 * @date: 2017年8月29日 下午3:28:06
 * @version V1.0
 *          <p>
 */
public class TokenManager {
    /**
     * 被T出的Session标志
     */
    public static final String SESSION_FORCE_LOGOUT_KEY = "session.force.logout";
    /**
     * 用户登录验证管理对象
     */
    // @Autowired
    // public static MonitorRealm realm;
    /**
     * Session管理
     */
    public static final SessionDAO sessionDAO = SpringContextUtil.getBean("sessionDAO",
            EnterpriseCacheSessionDAO.class);
    /**
     * Session管理对象
     */
    // @Autowired
    // public static CustomSessionManager customSessionManager;

    /**
     * 获取当前会话中的用户
     */
    public static User getUser() {
        return (User) SecurityUtils.getSubject().getPrincipal();
    }

    /**
     * 获取当前会话Session
     */
    public static Session getSession() {
        return SecurityUtils.getSubject().getSession();
    }

    /**
     * 将键值对放入当前Session中
     */
    public void setValue2Session(Object key, Object value) {
        getSession().setAttribute(key, value);
    }

    /**
     * 从当前Session中取出值
     */
    public Object getValue4Session(Object key) {
        return getSession().getAttribute(key);
    }

    /**
     * 判断是否登录
     */
    public static boolean isLogined() {
        return null != SecurityUtils.getSubject().getPrincipal();
    }

    /**
     * 退出登录
     */
    public static void logout() {
        SecurityUtils.getSubject().logout();
    }

    /**
     * 清空当前用户权限信息。
     */
    public static void clearNowUserAuth() {
        // realm.clearCachedAuthorizationInfo();
    }

    /**
     * 获取所有Session
     */
    public static Collection<Session> getAllSessions() {
        return sessionDAO.getActiveSessions();
    }

    /**
     * 当用户信息发生改变时，使用户的session退出
     * 
     * @param user
     */
    public static void logoutUser(User outUser) {
        for (Session session : getAllSessions()) {
            User user = null;
            try {
                // 取出Sesiion中的用户
                PrincipalCollection principals = (PrincipalCollection) session
                        .getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
                if (!CollectionUtils.isEmpty(principals)) {
                    user = (User) principals.getPrimaryPrincipal();
                }
            } catch (Exception e) {
                continue;
            }
            // 匹配用户信息
            if (user != null && user.getUserId().intValue() == outUser.getUserId().intValue()) {
                session.setAttribute(SESSION_FORCE_LOGOUT_KEY, true);
                System.out.println(user);
            }
        }
    }
}
